#include <REGX52.H>
#include "Timer0.h"
#include "Int0.h"

unsigned int IR_Time;
unsigned char IR_State;

unsigned char IR_Data[4];
unsigned char IR_pData;

unsigned char IR_DataFlag;
unsigned char IR_RepeatFlag;
unsigned char IR_Address;
unsigned char IR_Command;

void IR_Init(void) {
	Timer0_Init();
	Int0_Init();
}

unsigned char IR_GetDataFlag(){
	if(IR_DataFlag) {
		IR_DataFlag=0; 
		return 1;
	}
	return 0;
}

unsigned char IR_GetRepeatFlag(){
	if(IR_RepeatFlag) {
		IR_RepeatFlag=0;
		return 1;
	}
	return 0;
}


unsigned char IR_GetAddress(){
	return IR_Address;
}

unsigned char IR_GetCommand(){
	return IR_Command;
}

 

// 注意 晶振频率直接影响功能是否可用！！！！
void Int0_Routine(void) interrupt 0
{
	//parse IR time line.
	if(IR_State == 0){ 
		Timer0_SetCounter(0);
		Timer0_Run(1);
		IR_State =1;
	} else if (IR_State == 1) { 
		IR_Time = Timer0_GetCounter();
		Timer0_SetCounter(0);
		//如果计时为13.5ms，则接收到了Start信号（判定值在12MHz晶振下为13500，在11.0592MHz晶振下为12442）
		if(IR_Time >12442-500 && IR_Time <12442+500) {
			// start data
			IR_State = 2;
			
		}
		//如果计时为11.25ms，则接收到了Repeat信号（判定值在12MHz晶振下为11250，在11.0592MHz晶振下为10368）
		else if(IR_Time > 10368-500 && IR_Time < 10368+500) {
			// repeat data
			IR_RepeatFlag = 1;
			Timer0_Run(0);
			IR_State = 0;
		} else { // 错误重置
			IR_State = 1;
		}
	} else if (IR_State == 2) {
		IR_Time = Timer0_GetCounter();
		Timer0_SetCounter(0);
		//如果计时为1120us，则接收到了数据0（判定值在12MHz晶振下为1120，在11.0592MHz晶振下为1032）
		if(IR_Time>1032-500 && IR_Time<1032+500) {
			IR_Data[IR_pData/8] &= ~(0x01<<(IR_pData%8));
			IR_pData++;
		} 
		//如果计时为2250us，则接收到了数据1（判定值在12MHz晶振下为2250，在11.0592MHz晶振下为2074）
		else if(IR_Time>2074-500 && IR_Time<2074+500) {
			IR_Data[IR_pData/8] |= (0x01<<(IR_pData%8));
			IR_pData++;
		} else {
			IR_pData=0;
			IR_State=1;
		}
		
		if(IR_pData>=32) {
			IR_pData=0;
			if((IR_Data[0] == ~IR_Data[1])
					&& (IR_Data[2] == ~IR_Data[3])
			) { //红外协议的 数据部分 01位是取反的，相当与奇偶校验
				IR_Address= IR_Data[0];
				IR_Command=IR_Data[2];
				IR_DataFlag = 1;
			}
			Timer0_Run(0);
			IR_State=0;
		}
	
	}
	
	
	
	
}


